import com.sun.xml.internal.fastinfoset.util.StringArray;
import org.junit.Test;

import java.sql.SQLOutput;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.BiFunction;
import java.util.function.Function;

/**
 * @author zk
 * @Description: 方法引用测试
 * @date 2019-10-12 11:03
 */
public class MethodReferencesTest {
    @Test
    public void test1(){
        /*
         * 类型	                                  示例
         * 引用静态方法	                          ContainingClass::staticMethodName
         * 引用特定对象的实例方法	                  containingObject::instanceMethodName
         * 引用一个特定类型的任意对象的实例方法	      ContainingType::methodName
         * 引用一个构造函数	                      ClassName::new
         *
         * 注意：
         * 1、当函数式接口方法的参数和返回值与调用方法一致是可以使用方法引用
         */

        /*
         * 引用静态方法,因User#isSuccess方法与函数式几口Function#apply参数和返回值一致，所以直接可以使用方法引用
         */
        //printSuccess(new User().setAge(29).setSalary(10001.0),User::isSuccess);

        /*
         * 引用特定对象的实例方法
         */
        /*User user = new User(3, "王二", User.Sex.FEMALE, 27, 6000.0D, LocalDate.of(1992,4,10));
        printSuccess(new User().setAge(29).setSalary(10001.0),user::isSuccess2);*/

        /*
         * 引用一个特定类型的任意对象的实例方法
         */
        /*String[] stringArray = { "Barbara", "James", "Mary", "John",
                "Patricia", "Robert", "Michael", "Linda" };
        Arrays.sort(stringArray, String::compareToIgnoreCase);
        for (String s : stringArray) {
            System.out.println(s);
        }*/

        /*
         * 引用一个构造函数
         */
        /*ThreadLocal<User> tl = ThreadLocal.withInitial(User::new);
        System.out.println(tl.get());*/
    }

    private void printSuccess(User user, Function<User, Boolean> func){
        if(func.apply(user)){
            System.out.println(user);
        }
    }
}
